Simple Queue Service,是 AWS 提供的訊息佇列服務。
SQS 可以搭配其他 AWS 服務。讓分散式處理的應用程式更具擴充性。
可以 用來解除系統與系統之間的偶合程度 。
實際應用在影片轉檔這類需要大量運算、計算量較大的工作,會花上一些時間。
總不可能要 User 一直等在那邊等待伺服器回復吧?
因此可以考慮把架構調整成 Producer 和 Consumer 這類的架構。
主要會有幾個重要的角色:
Producer 生產的 Message,預設最大值為 256 KB 。如果檔案可能超過這個大小,建議將檔案放到 S3,然後再由 Consumer 去 S3 拉取檔案。
依照不同情境,SQS 有兩種不同的版本。
Standard Queue 提供最高輸送量、盡力提供最佳排序,以及至少交付一次,但是有可能超過一筆紀錄。
FIFO (First In First Out) Queue 的設計目的是要保證訊息只會完全依照它們的傳送順序且不會有重複的訊息送至佇列。
差異及特性如下表:
Standard Queue | FIFO (First In First Out) Queue |
---|---|
每秒近乎無限個交易數 (TPS) | 每秒 300 個訊息 (包括傳送、接收或刪除)每個操作可以操作最大值 10 則訊息。最多可支援 3000 則訊息。 |
至少傳遞一次,但是有可能重複傳遞 | 剛好只會傳遞一次 |
不保證順序性 | 保證順序性 |
總結一下,如果考量到時間的順序性,且不希望額外處理應用程式的等冪性,可以選擇 FIFO 版本。
等冪性 (相同訊息處理一次以上不會有不良影響)
一個 Queue,是可以容許多個 Consumer 去 Pull 訊息的。但是如果剛好多個 Consumer 去 Pull 同一筆 訊息進行處理的話。後續的處理就有可能導致資料重複或不正確。例如有一個 Queue 是專門處理發票開立,實際狀況是不能讓發票被計算兩次的。
因此 SQS 為了避免訊息重複處理,增加了 Invisibility 訊息不可見 的處理,當第一個 Consumer Pull 訊息後,被 Pull 的訊息就會暫時隱藏,讓其他 Consumer 無法 Pull。
訊息不可見也有 Timeout 時間,下限為 0 ,上限為 12 小時,預設為 30 秒。
記得!! 當 Consumer 完成訊息的任務以後,記得 Delete Message,這樣 SQS 會把暫時隱藏的消息完全刪除掉,減少之後訊息重用的情況發生。
放在 Queue 裡面的訊息,都有保留時間, 預設保留時間為 4 天 。當保留時間一到,SQS 會自動刪除該訊息。
可以設定 保留時間最小為 60 秒,最大為 14 天 。
由於 Amazon SQS 是分散式系統,因此有可能會回應空白的請求。
因此會需要搭配以下兩種方法擇一去接收訊息:
依據存取次數的數量來決定價格。
Short Polling 短輪詢,訪問次數多;Long Polling 長輪詢,訪問次數少。
訪問次數多相對的存取次數就多,成本也就越高。